// 01-higher-order-function:    高阶函数课堂代码练习

//高阶函数 - 函数作为参数


//练习1.模拟forEach函数
/*
*我们要模拟这个forEach函数，那么它需要几个参数，这几个参数分别是什么
*因为我们要遍历一个数组，所以它应该有一个参数，这个参数就是数组array
*当我们遍历这个数组之后，我们要对数组的每一项做处理，但是我们每次调用forEach的时候，我们的处理方式是不同的。
*比如：我要打印数组的每一项或者我要把数组的每一项赋给页面中指定的元素。
*所以这一块我们要传一个变化的内容，所以这个参数就是一个函数的形式fn
*/

function forEach(array, fn) {
    //遍历每一个元素
    for (var i = 0; i < array.length; i++) {
        //处理数组中的每一个元素
        fn(array[i])
    }
}

//测试：打印输出每一个元素
var arr = [1, 2, 3, 4, 7, 8];
/*
*调用forEach方法，传入参数arr
*第二个参数就是我们要对数组重的元素做的事情，是一个函数
*forEach中调用fn函数的时候，传了一个参数就是数组中的每一项。
*所以这里我们要给它一个参数用来接收我们传入的每一项。
*/
forEach(arr, function (item) {
    console.log('forEach', item);
});


//练习2.模拟filter函数(过滤数组中满足条件的元素，并返回)

function filter(array, fn) {
    //定义一个数组，用来存储满足条件的元素
    var results = [];
    //遍历每一个元素
    for (var i = 0; i < array.length; i++) {
        //判断元素是否满足条件
        if (fn(array[i])) {
            //存储满足条件的元素
            results.push(array[i]);
        }
    }
    //返回满足条件的元素，且未改变元素组
    return results;
}

//测试：找到数组中所有偶数的元素
var arr = [1, 2, 3, 4, 7, 8];
//因为filter返回的是一个满足条件的数组，所以我们需要定义一个变量来存储filter返回的数据。
var r = filter(arr, function (item) {
    //因为filter原函数中要拿遍历每一项的返回结果true、false去判断，所以这里要return
    return item % 2 === 0;
});
console.log('filter', r);




